package org.example;

import lombok.extern.slf4j.Slf4j;

import static java.lang.Thread.sleep;

//情况1. 结果12或21
//@Slf4j(topic = "c.Number")
//class Number{
//    public synchronized void a() {
//        log.debug("1");
//    }
//    public synchronized void b() {
//        log.debug("2");
//    }
//}

//情况2.结果是1s 1 2 或者 2 1s 1
//@Slf4j(topic = "c.Number")
//class Number{
//    public synchronized void a() throws InterruptedException {
//        sleep(1);
//        log.debug("1");
//    }
//    public synchronized void b() {
//        log.debug("2");
//    }
//}

//情况3 结果是3 1s 1 2或者2 3 1s 1 或者3 2 1s 1
//@Slf4j(topic = "c.Number")
//class Number{
//    public synchronized void a() throws InterruptedException {
//        sleep(1);
//        log.debug("1");
//    }
//    public synchronized void b() {
//        log.debug("2");
//    }
//    public void c() {
//        log.debug("3");
//    }
//}


//情况4  结果：2 1s后 1
//@Slf4j(topic = "c.Number")
//class Number{
//    public synchronized void a() throws InterruptedException {
//        sleep(1);
//        log.debug("1");
//    }
//    public synchronized void b() {
//        log.debug("2");
//    }
//}

//情况5  结果: 2 1s后1
//@Slf4j(topic = "c.Number")
//class Number {
//    public static synchronized void a() throws InterruptedException {
//        sleep(1);
//        log.debug("1");
//    }
//
//    public synchronized void b() {
//        log.debug("2");
//    }
//}

//情况6 结果:1s后 1 2或者2 1s后1
//@Slf4j(topic = "c.Number")
//class Number{
//    public static synchronized void a() throws InterruptedException {
//        sleep(1);
//        log.debug("1");
//    }
//    public static synchronized void b() {
//        log.debug("2");
//    }
//}

//情况7 结果2 1s 1
//@Slf4j(topic = "c.Number")
//class Number{
//    public static synchronized void a() throws InterruptedException {
//        sleep(1);
//        log.debug("1");
//    }
//    public synchronized void b() {
//        log.debug("2");
//    }
//}

//情况8 结果: 1s 1 2 或者 2 1s 1
@Slf4j(topic = "c.Number")
class Number{
    public static synchronized void a() throws InterruptedException {
        sleep(1);
        log.debug("1");
    }
    public static synchronized void b() {
        log.debug("2");
    }
}

//面试常问的线程八锁,其实考查的是synchronized锁住的是哪个对象
public class Main {

    public static void main(String[] args) {
        //1
//        Number n1 = new Number();
//        new Thread(()->{ n1.a(); }).start();
//        new Thread(()->{ n1.b(); }).start();

        //2
//        Number n1 = new Number();
//        new Thread(()->{ n1.a(); }).start();
//        new Thread(()->{ n1.b(); }).start();

        //3
//        Number n1 = new Number();
//        new Thread(()->{ n1.a(); }).start();
//        new Thread(()->{ n1.b(); }).start();
//        new Thread(()->{ n1.c(); }).start();

        //4
//        Number n1 = new Number();
//        Number n2 = new Number();
//        new Thread(()->{ n1.a(); }).start();
//        new Thread(()->{ n2.b(); }).start();

        //5
//        Number n1 = new Number();
//        new Thread(()->{ n1.a(); }).start();
//        new Thread(()->{ n1.b(); }).start();

        //6
//        Number n1 = new Number();
//        new Thread(()->{ n1.a(); }).start();
//        new Thread(()->{ n1.b(); }).start();

        //7
//        Number n1 = new Number();
//        Number n2 = new Number();
//        new Thread(()->{ n1.a(); }).start();
//        new Thread(()->{ n2.b(); }).start();

        //8
        Number n1 = new Number();
        Number n2 = new Number();
        new Thread(()->{
            try {
                n1.a();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }).start();
        new Thread(()->{ n2.b(); }).start();
    }
}